package com.shop.mapper;

import com.shop.entity.Product;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 商品数据访问层
 * 
 * 提供商品相关的数据库操作接口
 * 
 * @author Shop Management System
 * @version 1.0
 * @since 2024-01-01
 */
@Mapper
public interface ProductMapper {
    
    /**
     * 查询所有商品
     * 
     * @return 商品列表
     */
    List<Product> findAll();
    
    /**
     * 根据ID查询商品
     * 
     * @param id 商品ID
     * @return 商品信息
     */
    Product findById(Long id);
    
    /**
     * 根据商品编码查询商品
     * 
     * @param productCode 商品编码
     * @return 商品信息
     */
    Product findByProductCode(@Param("productCode") String productCode);
    
    /**
     * 根据商品名称或编码模糊查询商品
     * 
     * @param name 商品名称关键词
     * @param productCode 商品编码关键词
     * @return 商品列表
     */
    List<Product> findByNameContainingOrProductCodeContaining(@Param("name") String name, @Param("productCode") String productCode);
    
    /**
     * 根据分类查询商品
     * 
     * @param category 商品分类
     * @return 商品列表
     */
    List<Product> findByCategory(@Param("category") String category);
    
    /**
     * 查询所有起售商品
     * @return 商品列表
     */
    List<Product> findByStatus(@Param("status") Integer status);
    
    /**
     * 查询库存不足的商品
     * 
     * @param minStock 最小库存阈值
     * @return 商品列表
     */
    List<Product> findLowStockProducts(@Param("minStock") Integer minStock);
    
    /**
     * 查询缺货商品
     * 
     * @return 商品列表
     */
    List<Product> findOutOfStockProducts();
    
    /**
     * 保存商品信息
     * 
     * @param product 商品信息
     * @return 影响行数
     */
    int save(Product product);
    
    /**
     * 更新商品信息
     * 
     * @param product 商品信息
     * @return 影响行数
     */
    int update(Product product);
    
    /**
     * 根据ID删除商品
     * 
     * @param id 商品ID
     * @return 影响行数
     */
    @Delete("delete from shop_management.product where id = #{id}")
    void deleteById(@Param("id") Long id);
    
    /**
     * 更新商品库存
     * 
     * @param id 商品ID
     * @param stock 新库存数量
     * @return 影响行数
     */
    int updateStock(@Param("id") Long id, @Param("stock") Integer stock);

    void insert(Product product);
    List<Product> findByNameContaining(String name);
    List<Product> findByStock(int stock);

    Product findByCode(String code);

    @Delete("delete from shop_management.product where id = #{id}")
    void delete(Long id);


    void updateStock(@Param("id") Long id, @Param("stockQuantity") int stockQuantity);
} 